﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ReservaWCF.Dominio;
using System.Data.SqlClient;

namespace ReservaWCF.Persistencia
{
    public class ReservaDAO
    {
        //String strCnx = "data source=64.49.237.194;initial catalog=BDreserva;persist security info=True;user id=psdesa;password=PSdesa2014";
        String strCnx = "data source=.;initial catalog=BDreserva;Trusted_Connection=True";

        public int GrabarReserva(TB_RESERVA_VUELO entidadReserva, ref string mensaje)
        { 

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                int reservaID = 0;
                try
                {

                    db.TB_RESERVA_VUELO.Add(entidadReserva);
                    db.SaveChanges();

                    reservaID = entidadReserva.RESERVA_ID;
                }
                catch (Exception ex)
                {
                    mensaje = Utilidad.ObtenerMensajeExcepcion(ex);
                }

                return reservaID;
            }
            
        }

        public string ObtenerNuevoCodigo()
        {

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                string codigoReservaNuevo = string.Empty;

                int codigoReserva = 1;

                if (db.TB_RESERVA_VUELO.Count() > 0)
                {
                    codigoReserva = Convert.ToInt32(db.TB_RESERVA_VUELO.Max(p => p.RESERVA_ID)) + 1;
                }

                codigoReservaNuevo = string.Format("{0:000000}", codigoReserva);

                return codigoReservaNuevo;
            }
           
        }

        public bool GrabarDetallePasajero(TB_RESERVA_PAX entidadDetallePasajero, ref string mensaje)
        {

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                bool resultado = true;

                try
                {

                    db.TB_RESERVA_PAX.Add(entidadDetallePasajero);
                    db.SaveChanges();

                    
                }
                catch (Exception ex)
                {
                    mensaje = Utilidad.ObtenerMensajeExcepcion(ex);
                    resultado = false;
                }

                return resultado;
            }

        }

        public int ObtenerCorrelativoDetallePasajero(int reservaID)
        {

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                int correlativo = (from rp in db.TB_RESERVA_PAX
                                   where rp.RESERVA_ID == reservaID
                                   select rp).Count();

                //Se aumenta uno al correlativo
                correlativo = correlativo + 1;
                
                return correlativo;
            }
        }

        public bool GrabarDetalleSegmento(TB_RESERVA_SEGMENTO entidadDetalleSegmento, ref string mensaje)
        {

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                bool resultado = true;

                try
                {

                    db.TB_RESERVA_SEGMENTO.Add(entidadDetalleSegmento);
                    db.SaveChanges();
                    
                }
                catch (Exception ex)
                {
                    mensaje = Utilidad.ObtenerMensajeExcepcion(ex);
                    resultado = false;
                }

                return resultado;
            }

        }

        public int ObtenerCorrelativoDetalleSegmento(int reservaID)
        {

            using (BDReservaVueloEntities db = new BDReservaVueloEntities())
            {
                int correlativo = (from rp in db.TB_RESERVA_SEGMENTO
                                   where rp.RESERVA_ID == reservaID
                                   select rp).Count();

                //Se aumenta uno al correlativo
                correlativo = correlativo + 1;

                return correlativo;
            }
        }

        public Reserva ObtenerReserva(int pIntIdReserva)
        {
            Reserva objReserva = null;
            List<DetalleReservaPasajero> lstPasajeros = new List<DetalleReservaPasajero>();
            List<DetalleReservaSegmento> lstSegmentos = new List<DetalleReservaSegmento>();
            using (SqlConnection objSqlConnection = new SqlConnection(strCnx))
            {
                using (SqlCommand objSqlCommand = new SqlCommand())
                {
                    objSqlConnection.Open();
                    string strSQL = "SELECT R.*, E.ESTADO_NOM FROM TB_RESERVA_VUELO R, TB_ESTADO_RESERVA E WHERE R.RESERVA_ESTADO=E.ESTADO_ID AND RESERVA_ID=@CODIGO";

                    objSqlCommand.CommandText = strSQL;
                    objSqlCommand.CommandType = System.Data.CommandType.Text;
                    objSqlCommand.Connection = objSqlConnection;

                    objSqlCommand.Parameters.Add(new SqlParameter("@CODIGO", pIntIdReserva));

                    using (SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader())
                    {
                        while (objSqlDataReader.Read())
                        {
                            objReserva = new Reserva();
                            objReserva.ReservaID = int.Parse(objSqlDataReader["RESERVA_ID"].ToString());
                            objReserva.FechaReserva = DateTime.Parse(objSqlDataReader["RESERVA_FECHA"].ToString());
                            objReserva.Estado = int.Parse(objSqlDataReader["RESERVA_ESTADO"].ToString());
                            objReserva.NomEstado = (objSqlDataReader["ESTADO_NOM"].ToString());
                            objReserva.FechaSalida = DateTime.Parse(objSqlDataReader["FEC_SALIDA"].ToString());
                            objReserva.FechaRegreso = DateTime.Parse(objSqlDataReader["FEC_REGRESO"].ToString());
                            objReserva.CiudadOrigen = objSqlDataReader["CIU_ID_ORIGEN"].ToString();
                            objReserva.CiudadDestino = objSqlDataReader["CIU_ID_DESTINO"].ToString();
                            objReserva.MontoPago = Decimal.Parse(objSqlDataReader["VUELO_MONTO_PAGO"].ToString());
                            objReserva.NombreContacto = objSqlDataReader["CONTACTO_NOM"].ToString();
                            objReserva.ApellidoContacto = objSqlDataReader["CONTACTO_APE"].ToString();
                            objReserva.CodigoReserva = objSqlDataReader["RESERVA_CODIGO"].ToString();
                        }
                    }

                    //Pasajeros
                    strSQL = "SELECT * FROM TB_RESERVA_PAX WHERE RESERVA_ID=@CODIGO";

                    objSqlCommand.CommandText = strSQL;

                    using (SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader())
                    {
                        while (objSqlDataReader.Read())
                        {
                            DetalleReservaPasajero objDetalleReservaPasajero = new DetalleReservaPasajero();
                            objDetalleReservaPasajero.ReservaID = int.Parse(objSqlDataReader["RESERVA_ID"].ToString());
                            objDetalleReservaPasajero.NombrePAX = (objSqlDataReader["PAX_NOM"].ToString());
                            objDetalleReservaPasajero.ApellidoPaternoPAX = (objSqlDataReader["PAX_APE_PAT"].ToString());
                            objDetalleReservaPasajero.FechaNacimientoPAX = DateTime.Parse(objSqlDataReader["PAX_FEC_NAC"].ToString());
                            objDetalleReservaPasajero.TipoPAX = (objSqlDataReader["PAX_TIPO"].ToString());
                            objDetalleReservaPasajero.TipoDocumentoPAX = (objSqlDataReader["PAX_TIPO_DOC"].ToString());
                            objDetalleReservaPasajero.NumeroDocumentoPAX = (objSqlDataReader["PAX_NUM_DOC"].ToString());
                            lstPasajeros.Add(objDetalleReservaPasajero);
                        }
                    }
                    objReserva.DetalleReservaPasajero = lstPasajeros;

                    //Segmentos
                    strSQL = "SELECT * FROM TB_RESERVA_SEGMENTO WHERE RESERVA_ID=@CODIGO";

                    objSqlCommand.CommandText = strSQL;

                    using (SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader())
                    {
                        while (objSqlDataReader.Read())
                        {
                            DetalleReservaSegmento objDetalleReservaSegmento = new DetalleReservaSegmento();
                            objDetalleReservaSegmento.NumeroVuelo = int.Parse(objSqlDataReader["VUELO_NRO"].ToString());
                            objDetalleReservaSegmento.LAID = (objSqlDataReader["LA_ID"].ToString());
                            objDetalleReservaSegmento.FechaSalida = DateTime.Parse(objSqlDataReader["FEC_SALIDA"].ToString());
                            objDetalleReservaSegmento.FechaLlegada = DateTime.Parse(objSqlDataReader["FEC_LLEGADA"].ToString());
                            objDetalleReservaSegmento.CiudadOrigenID= (objSqlDataReader["CIU_ID_ORIGEN"].ToString());
                            objDetalleReservaSegmento.CiudadDestinoID= (objSqlDataReader["CIU_ID_DESTINO"].ToString());
                            lstSegmentos.Add(objDetalleReservaSegmento);
                        }
                    }
                    objReserva.DetalleReservaSegmento = lstSegmentos;
                }
            }
            return objReserva;
        }

        public void EmitirReserva(int pIntIdReserva) {
            using (SqlConnection objSqlConnection = new SqlConnection(strCnx))
            {
                using (SqlCommand objSqlCommand = new SqlCommand())
                {
                    objSqlConnection.Open();
                    string strSQL = "UPDATE TB_RESERVA_VUELO SET RESERVA_ESTADO=@ESTADO WHERE RESERVA_ID=@CODIGO";

                    objSqlCommand.CommandText = strSQL;
                    objSqlCommand.CommandType = System.Data.CommandType.Text;
                    objSqlCommand.Connection = objSqlConnection;

                    objSqlCommand.Parameters.Add(new SqlParameter("@ESTADO", 3));
                    objSqlCommand.Parameters.Add(new SqlParameter("@CODIGO", pIntIdReserva));
                    objSqlCommand.ExecuteNonQuery();
                }
            }
        }

        public List<Dominio.Reserva> ListarPorFiltro(DateTime pDatFecIni, DateTime pDatFecFin, String pStrEstado, String pStrCodigo)
        {
            List<Reserva> lstReserva = new List<Reserva>();
            using (SqlConnection objSqlConnection = new SqlConnection(strCnx))
            {
                using (SqlCommand objSqlCommand = new SqlCommand())
                {
                    objSqlConnection.Open();
                    string strSQL = "SELECT R.RESERVA_ID, R.RESERVA_FECHA, R.RESERVA_CODIGO, R.FEC_SALIDA, R.FEC_REGRESO, R.CIU_ID_ORIGEN, R.CIU_ID_DESTINO, R.VUELO_MONTO_PAGO, R.CONTACTO_APE, E.ESTADO_NOM FROM TB_RESERVA_VUELO R, TB_ESTADO_RESERVA E WHERE R.RESERVA_ESTADO=E.ESTADO_ID ";
                    string strSQLFiltro = "";

                    if (pStrCodigo != null)
                    {
                        strSQLFiltro = "AND R.RESERVA_CODIGO=@CODIGO";
                    }
                    else
                    {
                        if (pStrEstado == "0")
                        {
                            strSQLFiltro = "AND (R.RESERVA_FECHA BETWEEN @FECINI AND @FECFIN)";
                        }
                        else 
                        {
                            strSQLFiltro = "AND (R.RESERVA_FECHA BETWEEN @FECINI AND @FECFIN) AND R.RESERVA_ESTADO=@ESTADO";
                        }
                    }

                    objSqlCommand.CommandText = strSQL + " " + strSQLFiltro + " ORDER BY R.RESERVA_FECHA DESC";
                    objSqlCommand.CommandType = System.Data.CommandType.Text;
                    objSqlCommand.Connection = objSqlConnection;

                    if (pStrCodigo != null)
                    {
                        objSqlCommand.Parameters.Add(new SqlParameter("@CODIGO", pStrCodigo));
                    }
                    else
                    {
                        objSqlCommand.Parameters.Add(new SqlParameter("@FECINI", DateTime.Parse(pDatFecIni.ToString("dd/MM/yyyy") + " 00:00:00")));
                        objSqlCommand.Parameters.Add(new SqlParameter("@FECFIN", DateTime.Parse(pDatFecFin.ToString("dd/MM/yyyy") + " 23:59:59")));
                        if (pStrEstado != "0") {
                            objSqlCommand.Parameters.Add(new SqlParameter("@ESTADO", pStrEstado));
                        }
                    }

                    using (SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader())
                    {
                        while (objSqlDataReader.Read())
                        {
                            Reserva objReserva = new Reserva();
                            objReserva.ReservaID = int.Parse(objSqlDataReader["RESERVA_ID"].ToString());
                            objReserva.FechaReserva = DateTime.Parse(objSqlDataReader["RESERVA_FECHA"].ToString());
                            objReserva.NomEstado = (objSqlDataReader["ESTADO_NOM"].ToString());
                            objReserva.FechaSalida = DateTime.Parse(objSqlDataReader["FEC_SALIDA"].ToString());
                            objReserva.FechaRegreso = DateTime.Parse(objSqlDataReader["FEC_REGRESO"].ToString());
                            objReserva.CiudadOrigen = objSqlDataReader["CIU_ID_ORIGEN"].ToString();
                            objReserva.CiudadDestino = objSqlDataReader["CIU_ID_DESTINO"].ToString();
                            objReserva.MontoPago = Decimal.Parse(objSqlDataReader["VUELO_MONTO_PAGO"].ToString());
                            objReserva.ApellidoContacto = objSqlDataReader["CONTACTO_APE"].ToString();
                            objReserva.CodigoReserva = objSqlDataReader["RESERVA_CODIGO"].ToString();
                            lstReserva.Add(objReserva);
                        }
                    }
                }
            }
            return lstReserva;
        }
    }
}